package com.sheng.leetcode.year2022.month10.day21;

import org.junit.Test;

import java.util.*;

/**
 * @author liusheng
 * @date 2022/10/21
 *<p>
 * 901. 股票价格跨度<p>
 *<p>
 * 编写一个 StockSpanner 类，它收集某些股票的每日报价，并返回该股票当日价格的跨度。<p>
 * 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数（从今天开始往回数，包括今天）。<p>
 * 例如，如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85]，那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。<p>
 *<p>
 * 示例：<p>
 * 输入：["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]]<p>
 * 输出：[null,1,1,1,2,1,4,6]<p>
 * 解释：<p>
 * 首先，初始化 S = StockSpanner()，然后：<p>
 * S.next(100) 被调用并返回 1，<p>
 * S.next(80) 被调用并返回 1，<p>
 * S.next(60) 被调用并返回 1，<p>
 * S.next(70) 被调用并返回 2，<p>
 * S.next(60) 被调用并返回 1，<p>
 * S.next(75) 被调用并返回 4，<p>
 * S.next(85) 被调用并返回 6。<p>
 *<p>
 * 注意 (例如) S.next(75) 返回 4，因为截至今天的最后 4 个价格<p>
 * (包括今天的价格 75) 小于或等于今天的价格。<p>
 *<p>
 * 提示：<p>
 * 调用 StockSpanner.next(int price) 时，将有 1 <= price <= 10^5。<p>
 * 每个测试用例最多可以调用  10000 次 StockSpanner.next。<p>
 * 在所有测试用例中，最多调用 150000 次 StockSpanner.next。<p>
 * 此问题的总时间限制减少了 50%。<p>
 */
public class LeetCode0901 {

    @Test
    public void test01() {
        // 1, 1, 1, 2, 1, 4, 6
//        StockSpanner stockSpanner = new StockSpanner();
//        System.out.println(stockSpanner.next(100));
//        System.out.println(stockSpanner.next(80));
//        System.out.println(stockSpanner.next(60));
//        System.out.println(stockSpanner.next(70));
//        System.out.println(stockSpanner.next(60));
//        System.out.println(stockSpanner.next(75));
//        System.out.println(stockSpanner.next(85));

        // 1, 2, 1, 4, 1
        StockSpanner stockSpanner = new StockSpanner();
        System.out.println(stockSpanner.next(32));
        System.out.println(stockSpanner.next(82));
        System.out.println(stockSpanner.next(73));
        System.out.println(stockSpanner.next(99));
        System.out.println(stockSpanner.next(91));
    }
}
// 1139ms
//class StockSpanner {
//
//    List<Integer> list;
//
//    public StockSpanner() {
//        list = new ArrayList<>();
//    }
//
//    public int next(int price) {
//        int count = 0;
//        list.add(price);
//        int max = 0;
//        for (int i = list.size() - 1; i >= 0; i--) {
//            if (list.get(i) <= price) {
//                max++;
//            } else {
//                count = Math.max(count, max);
//                break;
//            }
//        }
//        count = Math.max(count, max);
//        return count;
//    }
//}

/**
 * Your StockSpanner object will be instantiated and called as such:
 * StockSpanner obj = new StockSpanner();
 * int param_1 = obj.next(price);
 */

// 22ms
class StockSpanner {
    Deque<int[]> d = new ArrayDeque<>();
    int cur = 0;
    public int next(int price) {
        while (!d.isEmpty() && d.peekLast()[1] <= price) {
            d.pollLast();
        }
        int prev = d.isEmpty() ? -1 : d.peekLast()[0], ans = cur - prev;
        d.addLast(new int[]{cur++, price});
        return ans;
    }
}
//
//作者：宫水三叶
//链接：https://leetcode.cn/problems/online-stock-span/solutions/1909869/by-ac_oier-m8g7/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
